// 导入stompJS
// StompJs不支持模块化加载，
// 是在webpack.config.base.js中对stomp.min.js添加的加载规则
// 使用script-loader和exports-loader
import {Stomp} from './stomp.min.js'
// 导入SockJS,使用SockJS和StompJS配合实现websock功能
import SockJS from 'sockjs-client'
// 根据环境配置不同的服务地址，开发环境需要做代理
const wsUrl =  process.env.NODE_ENV ==='development' 
  ?'http://carwash2.eveabc.com'
  :''
/** 
 * 一个websock封装类
 * 包含websock相关操作
*/
class WSUtil {
  /**
   * 
   * @param {string} endpoint  // 监听设备点
   * @param {} subscriptList  // 订阅列表
   * @param {function} onConnStatusEvent  // 状态发生改变的回调
   */
  constructor (endpoint,subscriptList,onConnStatusEvent) {
    this.stompClient = null // 保存Stomp实例
    this.endpoint = endpoint // 保存监听设备点
    this.subscript = subscriptList // 保存订阅列表
    this.iskeepopen = true // 保存是否保持连接
    this.keepopen_event // 保存实现持续连接的定时器
    this.onConnStatus=onConnStatusEvent  // 保存状态改变的回调
    this.continuousOpen() // 发起持续连接
  }
  /**
   * @return {Object} 一个通过SockJS创建的websock实例
   */
  newSocketJS () {
    const socket=new SockJS(wsUrl + this.endpoint)
    return socket
  }
  /*连接服务器*/
  open (sendEvent){
    const _self = this
    this.lastingClose() // 关闭已有打开持续连接
    const socket = this.newSocketJS(this.endpoint) // 创建新连接
    
    this.stompClient = Stomp.over(socket) //使用stopmJs包装
    // 开始连接
    this.stompClient.connect({},function(){
      // 通知连接状态发生改变
      _self.setConnected(true)
      /*加载订阅列表*/
      for(let item of _self.subscript){
        _self.stompClient.subscribe(item.name,item.subscribe)
      }
      // 连接成功回调
      typeof sendEvent === 'function' &&  sendEvent()
    })
  }
  /*持续连接服务器*/
  continuousOpen (){

    this.open() // 创建并打开连接
    this.iskeepopen = true // 标记打开持续连接
    // 添加持续连接检测定时器
    this.keepopen_event = setInterval(()=>{
      console.log('websocket checking...')
      if(this.iskeepopen && !this.isOpen()){
        console.log('close,reopen...')
        this.continuousOpen()
      }
    },5000)
  }
  /*关闭持续连接*/
  lastingClose (){
    clearInterval(this.keepopen_event) // 清楚持续连接检测定时器
    this.iskeepopen=false // 标记关闭持续连接
    this.close() // 关闭连接
  }
  /*关闭连接*/
  close(){
    // 已经创建stopClient，则关闭
    if(this.stompClient != null){
      try{
        this.stompClient.disconnect()
      }catch(e){
        console.log(e)
      }
		
    }
    // 通知连接状态发生改变
    this.setConnected(false)
    console.log('conn close')
  }
  /*检测是否连接状态的方法*/
  isOpen (){
    return !(this.stompClient == null || !this.stompClient.connected)
  }
  
  /*
 * 发送消息
 * name：路由名称
 * msg：发送内容
 **/
  sendMsg (name,msg){
    /*若未连接则打开连接*/
    if(this.isOpen()){ // 已经打开，直接发送消息
      this.stompClient.send('/'+name,{},msg)
    }else{ // 未打开，先打开，后发送消息
      console.log('open of not connected')
      this.open(()=>{
        this.stompClient.send('/'+name,{},msg)
      })
    }
  }
  /*状态变化触发*/
  setConnected (connected){
    if(this.onConnStatus){ // 存在状态发生改变的监听回调，则执行
      this.onConnStatus(connected)
    }
  }
}
export default WSUtil











